/* ===========================================================
 * TradeManager : An application to trade strategies for the Java(tm) platform
 * ===========================================================
 *
 * (C) Copyright 2011-2011, by Simon Allen and Contributors.
 *
 * Project Info:  org.trade
 *
 * This library is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
 * License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
 * USA.
 *
 * [Java is a trademark or registered trademark of Oracle, Inc.
 * in the United States and other countries.]
 *
 * (C) Copyright 2011-2011, by Simon Allen and Contributors.
 *
 * Original Author:  Simon Allen;
 * Contributor(s):   -;
 *
 * Changes
 * -------
 *
 */

package org.trade.core.util;

import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

import com.sun.tools.javac.Main;

/**
 */
public final class Javac {

	private String classpath;
	private String outputdir;
	private String sourcepath;
	private String bootclasspath;
	private String extdirs;
	private String encoding;
	private String target;

	/**
	 * Constructor for Javac.
	 * 
	 * @param classpath
	 *            String
	 * @param outputdir
	 *            String
	 */
	public Javac(String classpath, String outputdir) {
		this.classpath = classpath;
		this.outputdir = outputdir;
	}

	/**
	 * Compile the given source files.
	 * 
	 * @param srcFiles
	 * 
	 * @return null if success; or compilation errors
	 */
	public String compile(String srcFiles[]) {
		StringWriter err = new StringWriter();
		PrintWriter errPrinter = new PrintWriter(err);

		String args[] = buildJavacArgs(srcFiles);
		int resultCode = Main.compile(args, errPrinter);
		errPrinter.close();
		return (resultCode == 0) ? null : err.toString();
	}

	/**
	 * Method compile.
	 * 
	 * @param srcFiles
	 *            File[]
	 * @return String
	 */
	public String compile(File srcFiles[]) {
		String paths[] = new String[srcFiles.length];
		for (int i = 0; i < paths.length; i++) {
			paths[i] = srcFiles[i].getAbsolutePath();
		}
		return compile(paths);
	}

	/**
	 * Method buildJavacArgs.
	 * 
	 * @param srcFiles
	 *            String[]
	 * @return String[]
	 */
	private String[] buildJavacArgs(String srcFiles[]) {
		List<String> args = new ArrayList<String>();

		if (classpath != null) {
			args.add("-classpath");
			args.add(classpath);
		}
		if (outputdir != null) {
			args.add("-d");
			args.add(outputdir);
		}
		if (sourcepath != null) {
			args.add("-sourcepath");
			args.add(sourcepath);
		}
		if (bootclasspath != null) {
			args.add("-bootclasspath");
			args.add(bootclasspath);
		}
		if (extdirs != null) {
			args.add("-extdirs");
			args.add(extdirs);
		}
		if (encoding != null) {
			args.add("-encoding");
			args.add(encoding);
		}
		if (target != null) {
			args.add("-target");
			args.add(target);
		}

		for (int i = 0; i < srcFiles.length; i++) {
			args.add(srcFiles[i]);
		}

		return args.toArray(new String[args.size()]);
	}

	/**
	 * Method getBootclasspath.
	 * 
	 * @return String
	 */
	public String getBootclasspath() {
		return bootclasspath;
	}

	/**
	 * Method setBootclasspath.
	 * 
	 * @param bootclasspath
	 *            String
	 */
	public void setBootclasspath(String bootclasspath) {
		this.bootclasspath = bootclasspath;
	}

	/**
	 * Method getClasspath.
	 * 
	 * @return String
	 */
	public String getClasspath() {
		return classpath;
	}

	/**
	 * Method setClasspath.
	 * 
	 * @param classpath
	 *            String
	 */
	public void setClasspath(String classpath) {
		this.classpath = classpath;
	}

	/**
	 * Method getEncoding.
	 * 
	 * @return String
	 */
	public String getEncoding() {
		return encoding;
	}

	/**
	 * Method setEncoding.
	 * 
	 * @param encoding
	 *            String
	 */
	public void setEncoding(String encoding) {
		this.encoding = encoding;
	}

	/**
	 * Method getExtdirs.
	 * 
	 * @return String
	 */
	public String getExtdirs() {
		return extdirs;
	}

	/**
	 * Method setExtdirs.
	 * 
	 * @param extdirs
	 *            String
	 */
	public void setExtdirs(String extdirs) {
		this.extdirs = extdirs;
	}

	/**
	 * Method getOutputdir.
	 * 
	 * @return String
	 */
	public String getOutputdir() {
		return outputdir;
	}

	/**
	 * Method setOutputdir.
	 * 
	 * @param outputdir
	 *            String
	 */
	public void setOutputdir(String outputdir) {
		this.outputdir = outputdir;
	}

	/**
	 * Method getSourcepath.
	 * 
	 * @return String
	 */
	public String getSourcepath() {
		return sourcepath;
	}

	/**
	 * Method setSourcepath.
	 * 
	 * @param sourcepath
	 *            String
	 */
	public void setSourcepath(String sourcepath) {
		this.sourcepath = sourcepath;
	}

	/**
	 * Method getTarget.
	 * 
	 * @return String
	 */
	public String getTarget() {
		return target;
	}

	/**
	 * Method setTarget.
	 * 
	 * @param target
	 *            String
	 */
	public void setTarget(String target) {
		this.target = target;
	}

}
